(function(window, undefined){
  /**
  * 创建元素节点并返回
  */
  function create(tagName, className, parent){
  var element = document.createElement(tagName);
  element.className = className;
  parent.appendChild(element);
  return element;
  }
  /**
  * 数组消除重复
  */
  function clearRepeat(arr){
  var obj = {},
   result = [];
  for(var i = 0, len = arr.length; i < len; i++){
   obj[arr[i]] = 1;
  }
  for(var i in obj){
   result.push(i);
  }
  return result;
  }
  /**
  * 添加类名
  */
  function addClassName(element, className){
  var aClass = element.className.split(' ');
  aClass.push(className);
  aClass = clearRepeat(aClass);
  element.className = aClass.join(' ');
  }
  /**
  * 删除类名
  */
  function delClassName(element, className){
  var aClass = element.className.split(' '),
   index = aClass.indexOf(className);
  if(index > 0) aClass.splice(index, 1);
  element.className = aClass.join(' ');
  }
  /**
  * 检查是否含有类名
  * @param element
  * @param className
  * @returns {boolean}
  */
  function hasClassName(element, className){
  var aClass = element.className.split(' '),
   index = aClass.indexOf(className);
  if(index > 0) return true;
  return false;
  }
  var Pager = function(obj){
  this.__total = obj.total || 1;
  this.__index = obj.index || 1;
  this.__parent = obj.parent;
  this.__onchange = obj.onchange;
  //初始化分页器
  this.__init(obj);
  };
  var pro = Pager.prototype;
  /**
  * 初始化分页器
  */
  pro.__init = function(obj){
  if(this.__total < this.__index) return;
  //存储数字
  this.__numbers = [];
  //储存省略号
  this.__dots = [];
  this.__wrapper = create('div', 'pager-box', this.__parent);
  this.__body = create('div', 'pager', this.__wrapper);
  //存储上一页
  this.__preBtn = create('a', 'prev', this.__body);
  this.__preBtn.href = 'javascript:void(0);';
  this.__preBtn.innerText = (obj.label && obj.label.prev) || '上一页';
  //存储数字
  if(this.__total < 8){
   for(var i = 0; i < this.__total; i++){
   var t = create('a', 'number', this.__body);
   t.href = 'javascript:void(0);';
   t.innerText = i + 1;
   this.__numbers.push(t);
   }
  }else{
   for(var i = 0; i < 2; i++){
   var t = create('span', 'dots', this.__body);
   t.innerText = '...';
   this.__dots.push(t);
   };
   for(var i = 0; i < 7; i++){
   var t = create('a', 'number', this.__body);
   t.href = 'javascript:void(0);';
   this.__numbers.push(t);
   }
  }
  //存储下一页
  this.__nextBtn = create('a', 'next', this.__body);
  this.__nextBtn.href = 'javascript:void(0);';
  this.__nextBtn.innerText = (obj.label && obj.label.next) || '下一页';
  //
  this._$setIndex(this.__index);
  //
  this.__body.onclick = this.__doClick.bind(this);
  };
  pro.__doClick = function(e){
  var e = e || window.event,
   target = e.target || e.srcElement;
  //点击省略号
  if(target.tagName.toLowerCase() == 'span') return;
  //点击了不能点击的上一页或者下一页
  if(hasClassName(target, 'js-disabled')) return;
  //点击了当前页
  if(hasClassName(target, 'js-selected')) return;
  if(target == this.__preBtn){
   //点击了上一页
   this._$setIndex(this.__index - 1);
  }else if(target == this.__nextBtn){
   //点击了下一页
   this._$setIndex(this.__index + 1);
  }else{
   //点击了数字
   var index = target.innerText;
   this._$setIndex(index);
  }
  };
  /**
  * 跳转页数
  */
  pro._$setIndex = function(index){
  index = parseInt(index);
  //更新信息
  if(index != this.__index){
   this.__last = this.__index;
   this.__index = index;
  }
  //处理
  delClassName(this.__preBtn, 'js-disabled');
  delClassName(this.__nextBtn, 'js-disabled');
  if(this.__total < 8){
   //总页数小于8的情况
   if(this.__last) delClassName(this.__numbers[this.__last - 1], 'js-selected');
   addClassName(this.__numbers[this.__index - 1], 'js-selected');
   if(this.__index == 1) addClassName(this.__preBtn, 'js-disabled');
   if(this.__index == this.__total) addClassName(this.__nextBtn, 'js-disabled');
  }else{
   this.__dots[0].style.display = 'none';
   this.__dots[1].style.display = 'none';
   for(var i = 0; i < 7; i++){
   delClassName(this.__numbers[i], 'js-selected');
   };
   if(this.__index < 5){
   for(var i = 0; i < 6; i++){
    this.__numbers[i].innerText = i + 1;
   }
   this.__numbers[6].innerText = this.__total;
   this.__dots[1].style.display = 'block';
   this.__body.insertBefore(this.__dots[1], this.__numbers[6]);
   addClassName(this.__numbers[this.__index - 1], 'js-selected');
   if(this.__index == 1) addClassName(this.__preBtn, 'js-disabled');
   }else if(this.__index > this.__total - 4){
   for(var i = 1; i < 7; i++){
    this.__numbers[i].innerText = this.__total + i -6;
   }
   this.__numbers[0].innerText = '1';
   this.__dots[0].style.display = 'block';
   this.__body.insertBefore(this.__dots[0], this.__numbers[1]);
   addClassName(this.__numbers[this.__index + 6 - this.__total], 'js-selected');
   if(this.__index == this.__total) addClassName(this.__nextBtn, 'js-disabled');
   }else{
   this.__numbers[0].innerText = '1';
   for(var i = 1; i < 6; i++){
    this.__numbers[i].innerText = this.__index - 3 + i;
    if(i == 3) addClassName(this.__numbers[i], 'js-selected');
   }
   this.__numbers[6].innerText = this.__total;
   this.__dots[0].style.display = 'block';
   this.__body.insertBefore(this.__dots[0], this.__numbers[1]);
   this.__dots[1].style.display = 'block';
   this.__body.insertBefore(this.__dots[1], this.__numbers[6]);
   }
  }
  if(typeof this.__onchange == 'function'){
   this.__onchange({
   index: this.__index,
   last: this.__last,
   total: this.__total
   })
  }
  };
  /**
  * 得到总页数
  */
  pro._$getIndex = function(){
  return this.__index;
  };
  /**
  * 得到上一个页数
  */
  pro._$getLast = function(){
  return this.__last;
  };
  //变成全局
  window.Pager = Pager;
 })(window);